版本
只要继承了 APIView 就可以使用版本
1. 版本的作用
- 根据版本的不同返回相应的数据结构
- 限制只能使用哪几个版本的接口
2. 局部版本
- 局部版本的配置(即: versioning_class = 版本类)会覆盖掉该视图类在全局版本中的配置
- versioning_class = 版本类
- QueryParameterVersioning 版本类 -> 从 url 参数中获取版本号
- url版本参数的默认参数名: version
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning
class BookViewSet(APIView):
versioning_class = QueryParameterVersioning # 局部版本
def get(self, request, *args, **kwargs):
print(request.version) # v1 -> 获取当前版本号
print(request.versioning_scheme) # QueryParameterVersioning 的实例化对象
if request.version == 'v1':
return Response('v1版本的数据')
else:
return Response('其他版本的数据')
- URLPathVersioning 版本类 -> 使用url正则匹配获取版本号 -> 推荐使用
- 命名匹配的默认名称: version
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning
class BookViewSet(APIView):
versioning_class = URLPathVersioning # 局部版本
def get(self, request, *args, **kwargs):
print(request.version) # v1 -> 获取当前版本号
print(request.versioning_scheme) # QueryParameterVersioning 的实例化对象
if request.version == 'v1':
return Response('v1版本的数据')
else:
return Response('其他版本的数据')
- 注意: url必须使用命名匹配
# urls.py
urlpatterns = [
# url(r'api/(?P<version>[v1|v2]+)/book', BookViewSet.as_view()),
# 等同于
url(r'api/(?P<version>\w+)/book', BookViewSet.as_view()), # 使用该正则的前提必须设置了允许的版本
]
- request.version 和 request.versioning_scheme 的说明
- 如果使用了版本,那么 request 就会被绑定两个属性: version 和 versioning_scheme
- version: 当前版本,用于根据版本的不同返回相应的数据结构
- versioning_scheme: 当前使用的版本类的实例化对象
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning
class BookViewSet(APIView):
versioning_class = URLPathVersioning
def get(self, request, *args, **kwargs):
print(request.version) # v1 -> 获取当前版本号
print(request.versioning_scheme) # QueryParameterVersioning 的实例化对象
if request.version == 'v1':
return Response('v1版本的数据')
else:
return Response('其他版本的数据')
- version 参数名的修改
- version 参数名必须要在全局设置中修改(即: settings.py)
- QueryParameterVersioning 的 url版本参数名 “version” 和 URLPathVersioning 命名匹配的 “version”,使用的都是同一个配置项中的参数名
# settings.py
REST_FRAMEWORK = {
"VERSION_PARAM": 'v', # 参数名
}
- 默认版本号
- 该设置必须在全局中进行设置(即: settings.py)
# settings.py
REST_FRAMEWORK = {
"VERSION_PARAM": 'version', # 参数名
'DEFAULT_VERSION': 'v1', # 默认版本号
}
- 允许的版本
- 说明: 允许调用当前接口的哪些版本
- 该设置必须在全局中进行设置(即: settings.py)
# settings.py
REST_FRAMEWORK = {
"VERSION_PARAM": 'version', # 参数名
'DEFAULT_VERSION': 'v1', # 默认版本号
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
}
2. 全局版本
- 全局版本作用于所有视图类
- 可以通过设置局部版本来覆盖全局版本的设置
# settings.py
REST_FRAMEWORK = {
……
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning", # 使用什么版本类
"VERSION_PARAM": 'version', # 参数名
'DEFAULT_VERSION': 'v1', # 默认版本号
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
}